package com.gxa.common.utils;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.commons.lang.StringUtils;

import java.util.Map;

/**
 * 查询参数
 *  构建分页Mybatis-plus分页插件 所需的IPage对象，顺便设置排序的规则
 *
 */
public class Query<T> {
    /**
     * map.put("pageNum",1);
     * map.put("pageSize",10)
     * map.put("order","asc")
     * map.put("orderField","id")
     */
    private static final String PAGE = "pageNum";
    private static final String LIMIT = "pageSize";
    private static final String ORDER_FIELD = "orderField";//排序的字段

    private static final String ORDER = "order";//看排序规则 order是否等于 asc
    private static final String ASC = "asc";

    public IPage<T> getPage(Map<String, Object> searchMap) {
        return this.getPage(searchMap, null, false);//默认降序
    }

    /**
     * 主要的 方法 上面的方法也是调下面的
     * @param searchMap
     * @param defaultOrderField 默认没有排序字段 null
     * @param isAsc 默认 降序3 2 1
     *     desc是descend 降序意思
     *     asc 是ascend 升序意思
     * @return
     */
    public IPage<T> getPage(Map<String, Object> searchMap, String defaultOrderField, boolean isAsc) {
        //分页参数
        long curPage = 1;
        long limit = 10;

        if(searchMap.get(PAGE) != null && searchMap.get(PAGE) != ""){
            curPage = Long.parseLong((String)searchMap.get(PAGE));
        }
        if(searchMap.get(LIMIT) != null && searchMap.get(LIMIT) != ""){
            limit = Long.parseLong((String)searchMap.get(LIMIT));
        }

        //分页对象
        Page<T> page = new Page<>(curPage, limit);

        //分页参数
        searchMap.put(PAGE, page);

        //排序字段
        //防止SQL注入（因为orderField、order是通过拼接SQL实现排序的，会有SQL注入风险）
        String orderField = SQLFilter.sqlInject((String)searchMap.get(ORDER_FIELD));//排序字段
        String order = (String)searchMap.get(ORDER);//是asc (升序） 还是不是asc(降序）


        //前端字段排序 设置排序字段 正常两个字段都传过来进行排序
        if(StringUtils.isNotEmpty(orderField) && StringUtils.isNotEmpty(order)){
            if(ASC.equalsIgnoreCase(order)) {
                return  page.addOrder(OrderItem.asc(orderField));
            }else {
                return page.addOrder(OrderItem.desc(orderField));
            }
        }
        //前端字段排序 只有排序字段 默认降序
        if(StringUtils.isNotEmpty(orderField)){
            if(isAsc) {
                return  page.addOrder(OrderItem.asc(orderField));
            }else {
                return page.addOrder(OrderItem.desc(orderField));
            }
        }

        //默认排序规则   defaultOrderField 为空，则不排序
        if(StringUtils.isBlank(defaultOrderField)){
            return page;
        }

        //默认排序规则 有排序字段  默认降序
        if(isAsc) {//false
            page.addOrder(OrderItem.asc(defaultOrderField));
        }else {
            page.addOrder(OrderItem.desc(defaultOrderField));
        }

        return page;
    }
}
 
